const WebSocket = require('ws');
const http = require('http');
const XMLHttpRequest = require('xhr2');
const path = require('path');
const fs = require('fs');
 
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('WebSocket Server\n');
});
 
const wss = new WebSocket.Server({ server, origin: '*' });


let currentFileIndex = 0
const fileList = [
  {name: '1-WakeVelocity-DVP-40rpm-back0.5m-r0.5m.xlsx'},
  {name: '2-WakeVelocity-DVP-40rpm-back1m-r0.5m.xlsx'},
  {name: '3-WakeVelocity-DVP-40rpm-back1.5m-r0.5m.xlsx'},
  {name: '4-WakeVelocity-DVP-40rpm-back2m-r0.5m.xlsx'},
  {name: '5-WakeVelocity-DVP-40rpm-back2.5m-r0.5m.xlsx'},
]
wss.on('connection', (ws) => {
  console.log('connect OK!');
 
  ws.on('message', (message) => {
    console.log('收到消息：', message);
 
    // 向客户端发送消息
    setInterval(() => {
      if (currentFileIndex < fileList.length) {
        const fileName = fileList[currentFileIndex].name
        console.log(currentFileIndex);
        const excelFilePath = path.join(__dirname, 'docs/excel', fileName);
        // 读取Excel文件
        fs.readFile(excelFilePath, (err, data) => {
          if (err) {
            console.error('Error reading file:', err);
            ws.send(JSON.stringify({ error: 'Error reading file' }));
            return;
          }
          const fileName = path.basename(excelFilePath);
          const fileType = 'application/vnd.openxmlformats - officedocument.spreadsheetml.sheet';
          // 构建类似File对象的数据
          const fileData = {
            name: fileName,
            type: fileType,
            content: data.toString('base64')
          };
          // 将数据发送给前端
          ws.send(JSON.stringify(fileData));
          currentFileIndex = currentFileIndex + 1;
        });
      }
    }, 1000);
 
  });
 
  // 连接关闭时的回调
  ws.on('close', () => {
    console.log('客户端已断开连接');
  });
});
 
server.listen(3005, () => {
  console.log('WebSocket 服务器已启动在 http://localhost:3005');
});


/**
 * 文件链接获取文件
 * @param {*} url 文件链接地址
 * @param {*} fileName 文件名
 * @returns 
 */
function getFileFromUrl(url, fileName) {
  return new Promise((resolve, reject) => {
    var blob = null;
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.setRequestHeader('Accept', 'image/png');
    xhr.responseType = "blob";
    // 加载时处理
    xhr.onload = () => {
      // 获取返回结果
      blob = xhr.response;
      let file= new File([blob], fileName, { type: 'image/png' });
      // 返回结果
      resolve(file);
    };
    xhr.onerror = (e) => {
      reject(e)
    };
    // 发送
    xhr.send();
  });
}

/**
 *  Node.js 没有原生的File对象概念，但我们可以读取文件内容，
 *  然后将相关信息（文件名、文件类型、文件内容）以一种前端能理解的格式发送。
 *  前端的File对象有name（文件名）、type（文件类型）和content（文件内容）等属性
 */

